package toOffer;

/**
 * <h3>leetcode</h3>
 *
 * @author BigFaceCat
 * @date 2024/3/11 19:06
 * @description <p>有效的变位词 </p>
 */

import java.awt.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 题目：给定两个字符串 s 和 t，请判断它们是不是一组变位词。在一组
 * 变位词中，它们中的字符及每个字符出现的次数都相同，但字符的顺序不
 * 能相同。例如，"anagram"和"nagaram"就是一组变位词。
 */
public class toOffer5_3_32 {
    public static void main(String[] args) {
        String s = "aacc";
        String t = "ccac";
        System.out.println(isAnagram1(s, t));
    }

    /**
     * 取巧方法
     *
     * @param s
     * @param t
     * @return
     */
    public static boolean isAnagram1(String s, String t) {
        //s和t完全相同、s和t的位数不一样都返回false
        if (s.equals(t) || s.length() != t.length()) {
            return false;
        }
        char[] c1 = s.toCharArray();
        char[] c2 = t.toCharArray();
        Arrays.sort(c1);
        Arrays.sort(c2);
        return Arrays.equals(c1, c2);
    }

    /**
     * 思路：
     * 用map做，把s里的字母加到map里，key就是字母，value是出现的次数；
     * 再遍历t，减去字母在t中出现的次数
     * 最后看map里的value有没有超过0的值，有就说明不对
     *
     * @param s
     * @param t
     * @return
     */
    public static boolean isAnagram(String s, String t) {
        //s和t完全一致也返回错误
        if (s.equals(t) || s.length() != t.length()) {
            return false;
        }

        Map<Character, Integer> map = new HashMap<>();
        for (char c : s.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        for (char c : t.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) - 1);
        }
        for (Integer value : map.values()) {
            if (value > 0) {
                return false;
            }
        }

        return true;
    }
}
